<?php

require('init.php');

if( !isset($_POST['submit']) ){
	header('Location: index.php');
}

ini_set("upload_max_filesize", SOURCESIZE * 1024);

require(LIBWWWDIR . '/header.php');

$probid = @$_POST['prob'];
$contest = $_POST['cid'];
$langext = @$_POST['langext'];
$n_test = $_POST['ntest'];

//verificar que el submit haya sido dentro del tiempo permitido
if( $_POST['cm'] == '2' )
{
	$time_fin = now();
	$time_init = time_init($contest,$teamdata['login'],$probid,$conn_db2);
	$t_limit =  add_date($time_init['time_init'],"4");
	
	if ( difftime(strtotime($time_fin),strtotime($t_limit )) > 0 )
	{
		echo msgbox_team("Source code solution to: ".$probid, "too-late",'0');
		del_time_init($contest,$teamdata['login'],$probid,$conn_db2);
		exit(1);
	}else{
		//continua con el chequeo
		del_time_init($contest,$teamdata['login'],$probid,$conn_db2);	
	}
}

//verificar que el team logeado actualmente, no haya subido una solución para el actual problema
$num_sol = get_source('0',$probid, $contest, $conn_db2);
if( check_sc($num_sol, $teamdata['login'], $contest) != 0 )
{
	echo msgbox_team("Source code solution to: ".$probid, "You were uploaded source code yet",'0');
        exit(1);
} 

//verificar  progam.out.n archivos de salida al ejecutar el programa con los casos de prueba
for( $i=1; $i<=$n_test;  $i++ )
{
	$fileid = "program_out".$i;
	checkFileUpload ($_FILES[$fileid]['error']);	//verificar proceso de carga
	//verificar que el program.out uploaded sea tipo tex
	if( ($_FILES[$fileid]['type']=='text/plain') || 
		($_FILES[$fileid]['type'] =='application/octet-stream'))
	{
		$go_sc = true;
	}else{
		$go_sc = false;
	}
	if($go_sc == false)
	{
		error('Out file upload stopped by extension. Contact staff.');
		exit(1);
	}
	
	if( $_FILES[$fileid]['size'] == '0' )
		$check_out[$i] = 'false'; 
	else
		$check_out[$i] ='true';
}

//verificar archivo para el sourcecode
$file_sc = "source_code";
checkFileUpload ($_FILES[$file_sc]['error']);	//verificar proceso de carga
//verificar extención de archivo SC, para ahorrar proceso que sigue
if( $_FILES[$file_sc]['type'] == 'text/x-c++src' OR $_FILES[$file_sc]['type'] == 'text/x-java' OR
$_FILES[$file_sc]['type'] == 'text/x-csrc' OR 	$_FILES[$file_sc]['type'] == 'text/x-python') 
{
	$go_diff= true;	
}else{
	$go_diff= false;	
} 
if($go_diff==false)
{
	error('Source code upload stopped by extension. Contact staff.');
	exit(1);
}

if( $_FILES[$file_sc]['size'] == '0' )
		$check_sc = 'false'; 
else
		$check_sc ='true';

for( $i=1; $i<=$n_test; $i++ )
{
	if( $check_out[$i] == 'true')
		$contador= $contador +1;		
}

//si los archivos han pasado el chequeo de upload, continuar con chequeo id problem y lenguaje para sc
if( $contador ==  $n_test AND $check_sc == 'true')	
{
	$filename = $_FILES['source_code']['name'];
	$prob = get_problem($probid, $contest, $conn_db2);

	if ( ! isset($prob) ) err("Unable to find problem '$probid'");
		$probid = $prob['probid'];

	/* Determine the language */

	if ( empty($langext) ) 
	{
		if ( strrpos($filename, '.') === false ) 
		{
			error('Unable to autodetect the language from the uploaded filename');
		}
		$fileext = strtolower(substr($filename, strrpos($filename, '.')+1));

		$all_lang_exts = explode(" ", LANG_EXTS);

		foreach ($all_lang_exts as $langextlist) 
		{
			$langexts = explode(",", $langextlist);

			// Skip first element: that's the language name
			for ($i = 1; $i < count($langexts); $i++) 
			{
				if ( $langexts[$i]==$fileext ) $langext = $langexts[1];
			}
		}

		if ( empty($langext) ) error("Unable to find language for extension '$fileext'");
	}
	$lang = get_lenguaje($langext, $conn_db2);
	/*
	$lang = $DB->q('MAYBETUPLE SELECT langid, name, extension FROM language
                WHERE extension = %s AND allow_submit = 1', $langext);*/

	if ( empty($lang) ) error("Unable to find language by extention '$langext'");
		$langext = $lang['langid'];

	//copiar archivos  a temp
	$workdirpath = TMPDIR;

	//crear carpeta temporal: test.XXXXXX
	$dir = shell_exec("mktemp -d $workdirpath/test.XXXXXX");
		
	//copiar archivos del team (program_outx) en un archivo temporal(program_outx) 
	for( $i=1; $i<=$n_test;  $i++ )
	{
		$fileident = "program_out".$i;
		$file = $_FILES[$fileident]['tmp_name'];
		$topath = rtrim($dir).'\/'.$fileident;
		system("cp '$file'  $topath", $retval);
			if ( $retval!=0 ) error("Could not copy program to $topath");
		
	}
	//traer archivos de salida de db y guardarlos en un archivo
	$data = get_testcaseout_past($probid, $conn_db2);
	$files_out = array();//guarda el nombre de los archivos temporales outx.XXXXXX 
	$files_res = array();//guarda el nombre de los archivos temporales resx.XXXXXX 
	//crear archivos 
	for($i=1; $i<=$data[0]; $i++)
	{
		$file_out = "out".$i;
		$file_res = "res".$i;
		$path = rtrim($dir).'/'.$file_out;
		$ruta = rtrim($dir).'/'.$file_res;
		$new_path = shell_exec("mktemp  $path.XXXXXX");
		$files_out[$i] = $new_path;
		$new_ruta = shell_exec("mktemp  $ruta.XXXXXX");
		$files_res[$i] = $new_ruta;
		//copiar contenido de testcase_out de db a un archivo en tmp
		$dat =$data[$i]['output'];
		$fp = fopen($new_path, 'c+');
//después de escribir en el archivo agrega el signo: ? al nombre del archivo[1]
		fwrite($fp, $dat);
		fclose($fp);	
	}
	//comparar archivos outx.XXXXXX  con program_outx y escribir la respuesta en resx.XXXXXX
	$count = 0;
	for($i=1; $i<=$n_test; $i++)
	{
		$program = rtrim($dir).'\/'."program_out".$i; 
//por motivo [1] agrego signo ? al nombre del archivo
		$out =  rtrim($files_out[$i])."?";
		$res =  $files_res[$i];
		system("diff $out $program > $res");
		if ( $retval!=0 ) error("Could not redirect to $res");
		$rta = substr(shell_exec("ls -s $res"),0,1);	
		if($rta == 0)
			$count = $count +1;
	}

	if($count == $n_test)
	{	
	submit_scode($contest,$login,$probid,$langext,$_FILES['source_code']['tmp_name'],$conn_db2);

		echo msgbox_team("Source code solution to: ".$probid, "correct",'1');

		//borrar carpeta creada: free disk space 
		system("rm -rf $dir", $retval);
		if ( $retval!=0 ) error("Could not remove $dir");
		
	}else{
		//"ALGUNOS NO COINCIDEN";
		echo msgbox_team("Source code solution to: ".$probid, "error",'0');
	}
}else{
	error(" Any empty file was uploaded");		
	
}
    
require(LIBWWWDIR . '/footer.php');

